package com.cskaoyan.search.repository;


import com.cskaoyan.search.entity.ItemDocument;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Highlight;
import org.springframework.data.elasticsearch.annotations.HighlightField;
import org.springframework.data.elasticsearch.annotations.HighlightParameters;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

// Long 类型，指的是映射实体类中映射文档唯一标识值的成员变量的数据类型
public interface ProductRepository extends ElasticsearchRepository<ItemDocument, Long> {
    @Query(
            "{\n" +
                    "    \"match\": {\n" +
                    "      \"title\": \"?0\"\n" +
                    "    }\n" +
                    "  }"
    )
    List<ItemDocument> matchSearch(String title);

    /*
      1. 针对一个查询结果，返回对应的一页数据
      2. Pageable参数是当想要获取分页数据的时候，必须携带的参数，表示分页信息
         比如，查询第多少页数据，每页多少条数据等，该参数不会用来替换我们的@Query字符串中的参数
      3. 返回的结果是一个包含一页文档数据的Page对象
 */
    @Query(
            " {" +
                    "   \"match\": {\n" +
                    "      \"title\": \"?0\"\n" +
                    "    }" +
                    "}"
    )
    Page<ItemDocument> testSearchPage(String title, Pageable pageable);

    //  既想实现 高亮 又想实现分页(但是不会返回满足总的文档数量)
    @Query(
            "  {  \"match\": {\n" +
                    "      \"title\": \"?0\"\n" +
                    "    }" +
                    "}"
    )
    @Highlight(
            fields = {
                    @HighlightField(name = "title",
                            parameters = @HighlightParameters(
                                    preTags = "<font color='red'>", postTags = "</font>"))
            }
    )
    List<SearchHit<ItemDocument>> testHighlight(String title, Pageable pageable);

}
